package com.fowo.api.sys.component;

import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * 字段权限组管理器
 * @author yl_ls
 */
@Component
public class FieldPermissionGroupManager {
    @Resource
    private AccessManager accessManager;

    /**
     * 对列表中的每一个对象做字段权限过滤，无指定的权限时列出的权限对应字段设置为 null
     * @param list 要操作的列表
     * @param authority 权限
     * @param fieldNames 权限对应字段名
     * @param <T> 列表项类型
     */
    public <T> void filterItemFields(List<T> list, String authority, String ...fieldNames) {
        if (list == null || accessManager.canAccess(authority)) {
            // 空数据当前用户有权限，不需要过滤
            return;
        }
        for (T item : list) {
            clearFields(item, fieldNames);
        }
    }

    /**
     * 对对象做字段权限过滤，无指定的权限时列出的权限对应字段设置为 null
     * @param obj 要操作的对象
     * @param authority 权限
     * @param fieldNames 权限对应字段名
     * @param <T> 列表项类型
     */
    public <T> void filterFields(T obj, String authority, String ...fieldNames) {
        if (obj == null || accessManager.canAccess(authority)) {
            // 空数据当前用户有权限，不需要过滤
            return;
        }
        clearFields(obj, fieldNames);
    }

    private <T> void clearFields(T obj, String[] fieldNames) {
        if (obj == null) {
            return;
        }
        ReflectionUtils.doWithFields(obj.getClass(), field -> {
            for (String fieldName : fieldNames) {
                if (fieldName != null && fieldName.equals(field.getName())) {
                    field.trySetAccessible();
                    field.set(obj, null);
                    return;
                }
            }
        });
    }
}
